//
// Created by aquawius on 25-3-12.
//

#ifndef INSERT_SORT
#define INSERT_SORT

#include <algorithm>
#include <iostream>
#include <random>

// 插入 > 冒泡 & 选择

// 稳定的排序
// 插入排序总是认为前面的数据是有序的，依次向前找，将后面的元素插入到已经排序的序列的位置

/**
 * 如果数据趋于有序，插入排序是效率最高的排序算法。
 * 因为插入排序相较于冒泡排序来说，每次循环的时候，不需要频繁移动每一个元素（一次就移动一次）
 */

void insertSort(int arr[], int size)
{
    for (int i = 1; i < size; i++) {
        int val = arr[i];
        int j = i - 1;
        for (; j >= 0; j--) {
            if (arr[j] <= val) {
                break;
            }
            arr[j + 1] = arr[j];
        }
        arr[j + 1] = val;
    }
}

int main(int argc, char** argv)
{
    std::random_device rd;
    std::default_random_engine engine(rd());
    std::uniform_int_distribution<int> dis(0, 100);

    const auto arr = new int[100];

    for (int i = 0; i < 100; ++i) {
        arr[i] = dis(engine);
    }

    std::for_each(arr, arr + 100, [](const int a) { std::cout << a << ' '; });

    std::cout << std::endl;

    insertSort(arr, 100);

    std::for_each(arr, arr + 100, [](const int a) { std::cout << a << ' '; });

    // 释放动态分配的内存
    delete[] arr;

    return 0;
}

#endif // INSERT_SORT